//package com.seven.controller;
//
//import jakarta.websocket.OnClose;
//import jakarta.websocket.OnError;
//import jakarta.websocket.OnMessage;
//import jakarta.websocket.OnOpen;
//import jakarta.websocket.Session;
//import jakarta.websocket.server.PathParam;
//import jakarta.websocket.server.ServerEndpoint;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//
///**
// * "@ServerEndPoint" 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端，
// * 注解的值将被用于监听用户连接的终端访问URL地址，客户端可以通过这个URL连接到websocket服务器端
// *
// * @author seven.Yin
// */
//@ServerEndpoint("/websocket/{userId}")
//@Component
//public class WebSockTest {
//
//    /**
//     * 日志工具
//     */
//    private static final Logger log = LoggerFactory.getLogger(WebSockTest.class);
//    /**
//     * 与某个客户端的连接会话，需要通过它来给客户端发送数据
//     */
//    private Session session;
//    /**
//     * 用户id
//     */
//    private String userId;
//    /**
//     * 用来存放每个客户端对应的MyWebSocket对象
//     */
//    private static final CopyOnWriteArraySet<WebSockTest> webSockets = new CopyOnWriteArraySet<>();
//    /**
//     * 用来存在线连接用户信息
//     */
//    private static final ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<String, Session>();
//
//    /**
//     * 链接成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
//        try {
//            this.session = session;
//            this.userId = userId;
//            webSockets.add(this);
//            sessionPool.put(userId, session);
//            log.info("【websocket消息】有新的连接，总数为:" + webSockets.size());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 链接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        try {
//            webSockets.remove(this);
//            sessionPool.remove(this.userId);
//            log.info("【websocket消息】连接断开，总数为:" + webSockets.size());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     */
//    @OnMessage
//    public void onMessage(String message) {
//        log.info("【websocket消息】收到客户端消息:" + message);
//    }
//
//    /**
//     * 发送错误时的处理
//     *
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("用户错误,原因:" + error.getMessage());
//        error.printStackTrace();
//    }
//
//    /**
//     * 此为广播消息
//     */
//    public void sendAllMessage(String message) {
//        log.info("【websocket消息】广播消息:" + message);
//        for (WebSockTest webSocket : webSockets) {
//            try {
//                if (webSocket.session.isOpen()) {
//                    webSocket.session.getAsyncRemote().sendText(message);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * 此为单点消息
//     */
//    public void sendOneMessage(String userId, String message) {
//        Session session = sessionPool.get(userId);
//        if (session != null && session.isOpen()) {
//            try {
//                log.info("【websocket消息】 单点消息:" + message);
//                session.getAsyncRemote().sendText(message);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * 此为单点消息(多人)
//     */
//    public void sendMoreMessage(String[] userIds, String message) {
//        for (String userId : userIds) {
//            Session session = sessionPool.get(userId);
//            if (session != null && session.isOpen()) {
//                try {
//                    log.info("【websocket消息】 单点消息:" + message);
//                    session.getAsyncRemote().sendText(message);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//
//    }
//}
